﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using VentaElectrodomesticos.Contrato;
using VentaElectrodomesticos.Datos;

namespace VentaElectrodomesticos.Negocio
{
    public class UsuarioNegocio : BaseNegocio<UsuarioDAO,Usuario>
    {
        public override bool save(Usuario entity)
        {
            Usuario filter = new Usuario();
            filter.usuario = entity.usuario;
            if (this.getAll(filter).Count > 0) {
                throw new NegocioException("Ya existe un usuario con el mismo nombre");
            }

            return base.save(entity);
        }

        public override Usuario getById(Usuario entity)
        {
            Usuario usuario = base.getById(entity);
            EmpleadoNegocio empleadoNegocio = new EmpleadoNegocio();
            Empleado empleado = new Empleado();
            empleado.Id = usuario.empleado_id;
            usuario.__empleado = empleadoNegocio.getById(empleado);

            RolNegocio rolNegocio = new RolNegocio();
            usuario.__Roles = rolNegocio.getByUsuario(usuario);
            return usuario;
        }

        public Usuario authenticate(String username, String password) {
            Usuario filter = new Usuario();
            filter.usuario = username;
            List<Usuario> usuarios = this.dao.getAll(filter);
            if (usuarios.Count() == 0) {
                throw new UsuarioNotFoundException("El usuario no existe");
            }
            Usuario usuario = this.getById(usuarios.First());
            if ( usuario.inactivo == true )
            {
                throw new UsuarioNotFoundException("El usuario esta deshabilitado");
            }
            if ( usuario.__empleado.inactivo == true) {
                throw new UsuarioNotFoundException("El empleado esta deshabilitado");
            }

            if (usuario.contrasenia != password) {
                throw new InvalidPasswordException("La contraseña es invalida");
            }

            return usuario;
        }

        internal void disable(string usuario)
        {
            this.dao.disable(usuario);
        }
    }
}
